package com.gopawpaw.android.demo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.ListActivity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class MainActivity extends ListActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		Intent intent = getIntent();//获得Intent
        String path = intent.getStringExtra("com.gopawpaw.jason.PATH");//获取设置的path  第一次访问为null
        if (path == null) { //如果path为null 则设置为"" 以免操作引发NullPointEception异常
            path = "";
        }
        
        setListAdapter(new SimpleAdapter(this,getListData(path),android.R.layout.simple_list_item_1,
        		new String[] { "title" },new int[] { android.R.id.text1 }));
        
        
	}
	
	/**
     * 获取你所点击的父节点的下一级目录  如果是第一次加载则获取主目录
     * @param String path 当前节点 第一次加载为path=""
     * @return List<Map<String, Object>> 此参数用以和ListView 进行数据绑定
     */
    public List<Map<String, Object>> getListData(String path){
    	//创建一个List<Map<String, Object>>型  以便返回
    	List<Map<String,Object>> myListData=new ArrayList<Map<String,Object>>();
    	
    	
    	//创建一个意图以便过滤AndroidManifest.xml 所有  此类 意图的信息
    	//<intent-filter>
        //<action android:name="com.gopawpaw.jason" />
        //<category android:name="com.gopawpaw.jason.category.SAMPLE_CODE" />
        //</intent-filter>
    	Intent filterIntent=new Intent("com.gopawpaw.jason",null);
    	filterIntent.addCategory("com.gopawpaw.jason.category.SAMPLE_CODE");
    	
    	//创建一个PackageManager从而进行过滤意图 并封装在List<ResolveInfo>中
    	PackageManager pm=getPackageManager();
    	List<ResolveInfo> list=pm.queryIntentActivities(filterIntent, 0);

    	//如果没有此类意图 则直接返回null
    	if(list==null){
    		return null;
    	}
    	//创建一个String类型的数组声明为path_Split 当path不能null时 按'/'进行截取path 
    	//并保存在此数组内
    	String[] path_Split;
    	if(null==path||path.equals("")){
    		path_Split=null;
    	}else{
    		path_Split=path.split("/");
    	}
    	//创建一个Map key为String  values为Boolean  用以确认是否存在相同的目录 
    	//如果存在就不需要再次保存
    	Map<String,Boolean> map=new HashMap<String, Boolean>();
    	
    	//循环遍历应用配置文件里面所有的activity 并保存在resolveInfo 内
    	for (ResolveInfo resolveInfo : list) {
    		//获取此activity的label属性
    		String label =resolveInfo.loadLabel(pm).toString();
    		//如果是第一次进入此activity 或者  是您所点击的目录 包含在label下则进去
    		if(null==path_Split||label.contains(path)){
    			String [] label_Split=label.toString().split("/");
    			int len=0;
    			if(path_Split!=null){
    				len=path_Split.length;
    			}
    			String title= len>0?label_Split[len]:label_Split[0];
				String currentPath=len>0?path+"/"+label_Split[len]:label_Split[0];
				//如果此目录没有子目录  则进去 
    			if(label_Split.length-1==len){
    				addItem(myListData, title, yes_Execute_Intent(resolveInfo.activityInfo.applicationInfo.packageName,resolveInfo.activityInfo.name));
    				map.put(currentPath, true);
    			}
    			//如果此目录有子目录  则进去
    			else{   				
    				if(map.get(currentPath)==null){
    					addItem(myListData, title, no_Execute_Intent(currentPath));
    					map.put(currentPath, true);
    				}
    			}
    		}
		}
    	return myListData;
    }
    
    public void addItem(List<Map<String, Object>> list,String title,Intent myIntent){
    	Map<String,Object> map=new HashMap<String, Object>();
    	map.put("intent", myIntent);
    	map.put("title", title);
    	list.add(map);
    } 
    
    /**
     * 如果是此下面并没有子节点  则调用此方法进行跳转
     * @param String startActivity 应用程序目录  
     * @param String endActivity 需要跳转的具体activity的目录
     * @return 返回一个意图
     */
    public Intent yes_Execute_Intent(String startActivity,String endActivity){
    	Intent resultIntent=new Intent();
    	resultIntent.setClassName(startActivity, endActivity);
    	return resultIntent;
    }

    /**
     * 如果是此下面并没有子节点  则调用此方法进行跳转
     * @param String currentPath 当前记录的目录
     * @return 返回一个意图
     */
    public Intent no_Execute_Intent(String currentPath){
    	Intent resultIntent=new Intent();
    	resultIntent.setClass(this, MainActivity.class);
    	resultIntent.putExtra("com.gopawpaw.jason.PATH",currentPath);
    	return resultIntent;
    }
    
    /**
     * 当点击listView的选项时进入此方法
     * @param ListView l 记录那一个ListView被点击
     * @param View v  ListView 中被点击的是什么类型的view
     * @param int position 点击了哪一行
     * @param long  id 与position相同 不过是以long类型存在
     * @return 返回一个意图
     */
	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		// TODO Auto-generated method stub
		super.onListItemClick(l, v, position, id);
		 Map<?, ?> map = (Map<?, ?>) l.getItemAtPosition(position);
	     Intent intent = (Intent) map.get("intent");
	     
	     startActivity(intent);
	}
}
